home *** CD-ROM | disk | FTP | other *** search
- /* 1995 H.Ogasawara(COR.) */
-
- #include <microfio.h>
- #include <gviewlib.h>
- #include <microstr.h>
-
- int Slow= 0, Info= 0;
-
- typedef struct {
- unsigned short type;
- unsigned int fsize,
- reserved,
- offset;
- unsigned int size;
- } FILE_H;
- typedef struct {
- /* unsigned int size; /* 40 */
- unsigned int h,
- v;
- unsigned short plane,
- bit;
- unsigned int comp,
- imagesize,
- XP,
- YP,
- palet,
- CI;
- } INFO_H3;
- typedef struct {
- /* unsigned int size; /* 64 */
- unsigned short h,
- v,
- plane,
- bit;
- unsigned int comp,
- imagesize,
- XP,
- YP,
- palet,
- CI;
- } INFO_H2;
- static int
- Word( i )
- {
- unsigned char *p= (void*)&i, d;
- d= p[3]; p[3]= p[2]; p[2]= d;
- return i;
- }
- static int
- Long( i )
- {
- unsigned char *p= (void*)&i, d;
- d= p[1]; p[1]= p[2]; p[2]= d;
- d= p[3]; p[3]= p[0]; p[0]= d;
- return i;
- }
- static unsigned short
- ColorT( p )
- unsigned char *p;
- {
- return ((p[1]<<(11-3))&0xf800)+
- ((p[2]<<( 6-3))&0x07c0)+
- ((p[0]>>( 3-1))&0x003f);
- }
-
- static GVIEW*
- Alloc65( h, v )
- {
- GVIEW *gp= GViewAlloc( h, v, WindowAttrGraphic65536, 0 );
- if( !gp ){
- Err2( "", "メモリが確保できません" );
- return 0;
- }
- return gp;
- }
-
- static void
- palet_load( fm, palet, len )
- m_file *fm;
- unsigned short *palet;
- {
- unsigned short *pp= palet;
- unsigned char pbuf[256*8], *p= pbuf;
- Mread( fm, pbuf, len<<2 );
- for(; len-- ; p+= 4 )
- *pp++= ColorT( p );
- }
-
- /******************************/
- asm( "
- _Cpack4:
- movem.l d3-d7,-(sp)
- movem.l 4+5*4(sp),d4-d7
-
- move.w #$f800,d2
- move.w d4,d0
- and.w d2,d0
- lsr.w #2,d0
-
- move.w d5,d1
- and.w d2,d1
- lsr.w #2,d1
- add.w d1,d0
-
- move.w d6,d1
- and.w d2,d1
- lsr.w #2,d1
- add.w d1,d0
-
- move.w d7,d1
- and.w d2,d1
- lsr.w #2,d1
- add.w d1,d0
- and.w d2,d0
-
- move.w #$07c0,d2
- move.w d4,d3
- and.w d2,d3
-
- move.w d5,d1
- and.w d2,d1
- add.w d1,d3
-
- move.w d6,d1
- and.w d2,d1
- add.w d1,d3
-
- move.w d7,d1
- and.w d2,d1
- add.w d1,d3
-
- lsr.w #2,d3
- and.w d2,d3
- or.w d3,d0
-
- move.w #$003f,d2
- and.w d2,d4
- and.w d2,d5
- and.w d2,d6
- and.w d2,d7
- add.w d5,d4
- add.w d6,d4
- add.w d7,d4
- lsr.w #2,d4
- and.w d2,d4
- or.w d4,d0
-
- movem.l (sp)+,d3-d7
- rts
- " );
- /******************************/
-
-
- GVIEW *
- bmp_start( file )
- char *file;
- {
- m_file fm;
- FILE_H filehead;
- INFO_H3 head;
- GVIEW *gp= 0;
- int bit, palet, h, v, lsize, fsize;
- if( !Mopen( &fm, file ) ){
- Err2( file, " ファイルがオープンできません" );
- return 0;
- }
- fsize= Mfsize( &fm );
- Mread( &fm, &filehead, sizeof(FILE_H) );
- Mread( &fm, &head, sizeof(INFO_H3) );
- if( filehead.type != 'BM' || Long(filehead.size) != 40 ){
- Mclose( &fm );
- Err2( file, " サポートしていないデータ形式です" );
- return 0;
- }
- h= Long(head.h);
- v= Long(head.v);
- bit= Word(head.bit);
- if( !(palet= Long(head.palet)) )
- palet= (Long(filehead.offset)-sizeof(FILE_H)+4-
- Long(filehead.size)) >>2;
- lsize= (fsize-Long(filehead.offset))/v;
- if( Info ){
- char buf[128];
- ConsoleOpen();
- s_format_simple( buf, "(%d,%d) bit=%d palet=%d '%s'\r\n",
- h, v, bit, palet, file );
- ConsolePrint( buf );
- }
- if( bit == 8 || !palet ){
- if( h <= 512 && v <= 512 ){
- int i;
- unsigned short palbuf[256];
- if( !(gp= Alloc65( h, v )) ){
- Mclose( &fm );
- return 0;
- }
- if( palet ){
- palet_load( &fm, palbuf, palet );
- for( i= v-1 ; i >= 0 ; i-- ){
- unsigned char lbuf[512*4], *pp;
- unsigned short *sp= gp->buf+ i*h;
- int x;
- Mread( &fm, pp= lbuf, lsize );
- for( x= h ; x-- ;)
- *sp++= palbuf[*pp++];
- }
- }else{
- for( i= v-1 ; i >= 0 ; i-- ){
- unsigned char lbuf[512*4], *pp;
- unsigned short *sp= gp->buf+ i*h;
- int x;
- Mread( &fm, pp= lbuf, lsize );
- for( x= h ; x-- ; pp+= 3 )
- *sp++= ColorT(pp);
- }
- }
- }else{
- int i;
- unsigned short palbuf[256];
- if( h > 1024 )
- h= 1024;
- if( v > 1024 )
- v= 1024;
- h>>=1;
- v>>=1;
- if( !(gp= Alloc65( h, v )) ){
- Mclose( &fm );
- return 0;
- }
- if( palet ){
- palet_load( &fm, palbuf, palet );
- for( i= v-1 ; i >= 0 ; i-- ){
- unsigned char lbuf0[1024*2],
- lbuf1[1024*2],
- *pp0, *pp1;
- unsigned short *sp= gp->buf+ i*h;
- int x;
- Mread( &fm, pp0= lbuf0, lsize );
- Mread( &fm, pp1= lbuf1, lsize );
- if( Slow ) for( x= h ; x-- ;){
- unsigned short
- c0= palbuf[*pp0++],
- c1= palbuf[*pp0++],
- c2= palbuf[*pp1++],
- c3= palbuf[*pp1++];
- *sp++= Cpack4( c0,c1,c2,c3 );
- }else{
- for( x= h ; x-- ; pp1++ )
- *sp++= palbuf[*pp1++];
- }
- }
- }else{
- for( i= v-1 ; i >= 0 ; i-- ){
- unsigned char lbuf0[1024*3],
- lbuf1[1024*3],
- *pp0, *pp1;
- unsigned short *sp= gp->buf+ i*h;
- int x;
- Mread( &fm, pp0= lbuf0, lsize );
- Mread( &fm, pp1= lbuf1, lsize );
- if( Slow ) for( x= h ; x-- ;){
- unsigned short c0,c1,c2,c3;
- c0= ColorT(pp0);pp0+= 3;
- c1= ColorT(pp0);pp0+= 3;
- c2= ColorT(pp1);pp1+= 3;
- c3= ColorT(pp1);pp1+= 3;
- *sp++= Cpack4( c0,c1,c2,c3 );
- }else{
- for( x= h ; x-- ; pp1+= 6 )
- *sp++= ColorT(pp1);
- }
- }
- }
- }
- }else if( bit == 4 ){
- int i;
- if( h > 1024 )
- h= 1024;
- if( v > 1024 )
- v= 1024;
- gp= GViewAlloc( h, v, WindowAttrGraphic16, 0 );
- if( !gp ){
- Err2( file, "メモリが確保できません" );
- Mclose( &fm );
- return 0;
- }
- palet_load( &fm, gp->palet, palet );
- for( i= v-1 ; i >= 0 ; i-- ){
- unsigned char lbuf[1024*2], *pp;
- unsigned char *sp= (void*)gp->buf+ i*h;
- int x;
- Mread( &fm, pp= lbuf, lsize );
- for( x= h/2 ; x-- ; pp++ ){
- *sp++= *pp>>4;
- *sp++= *pp&15;
- }
- }
- }else{
- Mclose( &fm );
- Err2( file, "この画像タイプには対応していません" );
- return 0;
- }
- Mclose( &fm );
- return gp;
- }
-